from flask_sqlalchemy import SQLAlchemy
from flask import Flask
from redis import StrictRedis
from flask_wtf.csrf import CSRFProtect, generate_csrf
from flask_session import Session
from config import config_dict
import logging
from logging.handlers import RotatingFileHandler
from info.utils.common import do_index_class
import pymysql
pymysql.install_as_MySQLdb()


db = SQLAlchemy()
redis_store = None

# app = Flask(__name__)
#
# #  配置
# app.config.from_object(Config)
# # 配置数据库
# db = SQLAlchemy(app)
# # 配置redis
# redis_store = redis.StrictRedis(host=Config.REDIS_HOST, port=Config.REDIS_PORT)
# # 开启csrf保护
# CSRFProtect(app)
# # 设置session保存位置
# Session(app)


def create_log(config_name):
    """记录日志的配置函数"""
    # 设置日志的记录等级
    # config_dict[config_name].LOG_LEVEL 获取开发环境日志级别
    logging.basicConfig(level=config_dict[config_name].LOG_LEVEL)  # 调试debug级

    # 创建日志记录器，指明日志保存的路径、每个日志文件的最大大小、保存的日志文件个数上限
    file_log_handler = RotatingFileHandler("logs/log", maxBytes=1024 * 1024 * 100, backupCount=10)

    # 创建日志记录的格式 日志等级 输入日志信息的文件名 行数 日志信息
    # INFO manage.py 18 错误信息
    formatter = logging.Formatter('%(levelname)s %(filename)s:%(lineno)d %(message)s')

    # 为刚创建的日志记录器设置日志记录格式
    file_log_handler.setFormatter(formatter)

    # 为全局的日志工具对象（flask app使用的）添加日志记录器
    logging.getLogger().addHandler(file_log_handler)


def create_app(config_name):

    create_log(config_name)
    """通过传入不同的配置名字,初始化其对应配置的应用实例"""
    app = Flask(__name__)

    configClass = config_dict[config_name]
    app.config.from_object(configClass)

    #  配置
    # app.config.from_object(Config)
    # 配置数据库
    db = SQLAlchemy(app)
    # 配置redis
    global redis_store
    redis_store = StrictRedis(host=configClass.REDIS_HOST, port=configClass.REDIS_PORT, db=configClass.REDIS_NUM, decode_responses=True)
    # 开启csrf保护
    csrf = CSRFProtect(app)

    # 在每一次请求之后 将csrf_token值设置到cookie中
    @app.after_request
    def set_csrf_token(response):
        # 1.生成csrf_token随机值
        csrf_token = generate_csrf()

        # 2.借助响应对象设置csrf_token到cookie中
        response.set_cookie("csrf_token", csrf_token)
        # 3.返回响应对象
        return response

    # 设置session保存位置
    Session(app)

    # 注册自定义过滤器
    app.add_template_filter(do_index_class, "do_index_class")

    # 注册首页蓝图
    from info.modules.index import index_bp
    app.register_blueprint(index_bp)

    # 登入注册模块
    from info.modules.passport import passport_bp
    app.register_blueprint(passport_bp)

    from info.modules.news import news_bp
    app.register_blueprint(news_bp)

    from info.modules.profile import profile_bp
    app.register_blueprint(profile_bp)

    return app
